package tools

import (
	"bufio"
	"fmt"
	"io"
	"log"
	"os"
	"path/filepath"
	"sync"
)

// FileExist 这里需要判断错误类型, 有可能是权限不足, 无法进入目录不知道目录类型
func FileExist(filePath string) (bool, error) {
	_, err := os.Stat(filePath)
	if err == nil {
		return true, nil
	}
	if os.IsNotExist(err) == true {
		return false, nil
	}
	return false, err
}

// IsDir 判断是否为目录
func IsDir(path string) (bool, error) {
	// 获取文件或目录的信息
	fileInfo, err := os.Stat(path)
	if err != nil {
		return false, err
	}
	// 判断是否是目录
	if fileInfo.IsDir() {
		return true, nil
	} else {
		return false, nil
	}
}

// CopyFile 复制文件
func CopyFile(srcFile, dstFile string) (err error) {
	// 打开源文件
	source, err := os.Open(srcFile)
	if err != nil {
		fmt.Println("无法打开源文件:", err)
		return
	}
	defer source.Close()
	// 创建或截断目标文件
	destination, err := os.Create(dstFile)
	if err != nil {
		fmt.Println("无法创建目标文件:", err)
		return
	}
	defer destination.Close()

	// 使用缓冲区进行文件复制
	reader := bufio.NewReader(source)
	writer := bufio.NewWriter(destination)

	_, err = io.Copy(writer, reader)
	if err != nil {
		fmt.Println("文件复制失败:", err)
		return
	}

	// 确保所有内容都被写入磁盘
	err = writer.Flush()
	if err != nil {
		fmt.Println("刷新缓冲区时出错:", err)
		return
	}
	return nil
}

// WriteStringToFile 自定义日志内容 写入文件
func WriteStringToFile(content string, fileName string, mode string) (err error) {
	logLock.Lock()
	if fileName == "" {
		fileName = "common.log"
	}
	fileName = "./runtime/logs/" + fileName
	CreateDir(filepath.Dir(fileName))
	var flag int
	if mode == "" {
		flag = os.O_WRONLY | os.O_CREATE | os.O_APPEND
	} else {
		flag = os.O_WRONLY | os.O_CREATE
	}
	logFile, err := os.OpenFile(fileName, flag, 0644)
	if err != nil {
		return
	}
	_, err = logFile.Write([]byte(content + "\n"))
	if err != nil {
		fmt.Println("warning WriteStringToFile error ", err)
		return
	}
	err = logFile.Close()
	if err != nil {
		fmt.Println("warning WriteStringToFile error ", err)
		return
	}
	defer logLock.Unlock()
	return nil
}

var logLock sync.Mutex

func LogInfo(cmd string, content string, fileName string) {
	if fileName == "" {
		fileName = "common.log"
	}
	fileName = "./runtime/logs/" + fileName
	CreateDir(filepath.Dir(fileName))
	logFile, err := os.OpenFile(fileName, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
	if err != nil {
		fmt.Println("os.OpenFile")
		log.Fatal(err)
	}
	defer logFile.Close()
	logLock.Lock()
	_, _ = logFile.Write([]byte("[" + GetNow() + "]" + "\t" + cmd + "\n"))
	_, _ = logFile.Write([]byte(content))
	_, _ = logFile.Write([]byte("\n"))
	logLock.Unlock()
}

// CreateDir 创建目录
func CreateDir(dirName string) {
	err := os.MkdirAll(dirName, 0755)
	if err != nil {
		//log.Fatal(err)
		fmt.Println("目录创建失败!", dirName, ":", err)
	}
	//fmt.Println("目录创建成功", dirName)
}

// ReadFileContent 读取文件内容
func ReadFileContent(filePath string) (contentStr string, err error) {
	contentByte, err := os.ReadFile(filePath)
	if err != nil {
		return
	}
	contentStr = string(contentByte)
	return
}
